package cn.tedu.map;

import java.util.*;

/**本类用于测试Map接口*/
public class MapDemo {
    public static void main(String[] args) {
        //1.创建Map对象
        /**Map中的数据要符合映射规则，一定要注意同时指定K和V的数据类型
         * 至于这个K和V具体要设置成什么类型，取决于具体的业务需求*/
        Map<Integer,String> map = new HashMap<>();
        //2.向map集合存入数据，注意方法是put
        map.put(9527,"白骨精");
        map.put(9528,"黑熊精");
        map.put(9529,"鲤鱼精");
        map.put(9530,"黄毛怪");
        map.put(9527,"女儿国国王");
        map.put(9531,"黑熊精");
        /**1.Map中的Key不允许重复，如果重复，后面的value会把前面的value覆盖点
         * 比如：女儿国国王和白骨精的Key都是9527，白骨精就被覆盖掉了
         * 2.Map中的value可以重复，比如我们有两个黑熊精*/
        System.out.println(map);

        //3.进行方法测试
//        map.clear();//清空集合
//        System.out.println(map);//{}
        System.out.println(map.isEmpty());//false,判断集合是否为空
        System.out.println(map.size());//5,获取集合中键值对的对数
        System.out.println(map.containsKey(9527));//true,判断集合是否包含指定的键
        System.out.println(map.containsValue("白骨精"));//value，判断集合是否包含指定的值
        System.out.println(map.remove(9529));//根据Key删除对应的这一对键值对，K和V都删了
        System.out.println(map);
        System.out.println(map.containsValue("鲤鱼精"));
        Collection<String> c = map.values();//Collection集合 将map中所有的value值取出，存入Collection中
        System.out.println(c);//[女儿国国王, 黑熊精, 黄毛怪, 黑熊精]
        System.out.println("hashCode"+map.hashCode());


        //4.map集合的迭代方式1
        /**方式1：
         * 遍历map中的数据，但是map本身没有迭代器，所以需要先转换成set集合
         * 用到的方法就是keySet()：把map中的所有Key值，存入到set集合中，返回值为set<Key的类型>*/
        //4.1将map集合的所有key值取出，存入Set集合中，Set集合的泛型就是key类型
        Set<Integer> set = map.keySet();
        //4.2迭代set集合，首先获取迭代器
        Iterator<Integer> it = set.iterator();
        //4.3循环，判断是否有下一个元素可以迭代
        while (it.hasNext()){
            //4.4获取本轮循环到的元素，就是set中存的每个key
            Integer key = it.next();
            //4.5根据key获取map中对应的value
            String value = map.get(key);
            System.out.println("{"+key+","+value+"}");//拼接打印
        }
//        Set<Integer> set1 = map.keySet();
//        Iterator<Integer> ito = set1.iterator();
//        while (ito.hasNext()){
//            Integer a  = ito.next();
//            String b = map.get(a);
//            System.out.println("{"+a+","+b+"}");
//        }

        /**方式2：
         * 遍历map集合，需要把map集合先转为set集合
         * 是把map集合中的一对键值对key&value作为一个Entry<K,V>整体放入set中
         * 一对K,V就是一个Entry*/
        Set<Map.Entry<Integer, String>> set2 = map.entrySet();
        Iterator<Map.Entry<Integer, String>> it2 = set2.iterator();
        while (it2.hasNext()){
            Map.Entry<Integer, String> entry = it2.next();
            System.out.println(entry);//直接打印本轮循环到的entry可以直接查看<K,V>
            Integer key = entry.getKey();//单独获取本entry中的key值
            String value = entry.getValue();//单独获取本entry中的value值
            System.out.println(key+"!!!"+value);
        }


    }
}
